// #include <iostream>
// #include <queue>
// #include <vector>
#include "KamaCoder.h"

// using namespace std;

// 定义二叉树
// struct TreeNode {
//   int val;
//   TreeNode* left;
//   TreeNode* right;
//   TressnNode(int _val) : val(_val), left(NULL), right(NULL) {}
// };

KamaCoder143::TreeNode* KamaCoder143::createTrees(vector<string>& vecs) {
  TreeNode* root = new TreeNode(stoi(vecs[0]));
  int i = 1;  // 下标
  queue<TreeNode*> q;
  q.push(root);
  while (!q.empty() && i < vecs.size()) {
    // 取出当前的节点
    TreeNode* curnode = q.front();
    q.pop();
    if (vecs[i] != "null") {
      curnode->left = new TreeNode(stoi(vecs[i]));
      q.push(curnode->left);
    }
    i++;  // 这样如果有一个节点为空的话，不用再进行赋值，也不会出错
    if (i < vecs.size() && vecs[i] != "null") {  // 右子树
      curnode->right = new TreeNode(stoi(vecs[i]));
      q.push(curnode->right);
    }
    i++;
  }

  return root;
}

// int result = 0;

int KamaCoder143::findPath(TreeNode* root) {
  if (root == NULL) return 0;
  // 左右中  后序遍历
  int left = findPath(root->left);
  int right = findPath(root->right);
  int leftpath = 0, rightpath = 0;
  // 如果当前左子树的值与根节点的值相等，则再进行相加,
  // 如果不同的话，再上一个节点已经提交过了，所以从该节点就要重新置为0
  if (root->left != NULL && root->val == root->left->val) leftpath = left + 1;
  // 同理右子树
  if (root->right != NULL && root->val == root->right->val)
    rightpath = right + 1;
  // 取最大值
  result = max(result, leftpath + rightpath);
  return max(leftpath, rightpath);
}

int KamaCoder143::run() {
  // 输入
  int n;
  cin >> n;
  string s;
  vector<string> vecs(n);
  for (int i = 0; i < n; i++) {
    cin >> s;
    vecs[i] = s;
  }
  if (vecs.size() == 0 || vecs[0] == "null") return 0;
  // 构建二叉树
  TreeNode* root = createTrees(vecs);
  // 查找最大路径
  findPath(root);
  cout << result << endl;

  return 0;
}